﻿using System;
using System.Threading;
using System.Threading.Tasks;

namespace Multithreading多线程
{
    /// <summary>
    /// 1 进程-线程-多线程，同步和异步
    /// 2 委托启动异步调用
    /// 3 多线程特点：不卡主线程、速度快、无序性
    /// 4 异步的回调和状态参数
    /// 5 异步等待三种方式
    /// 6 异步返回值
    /// 
    /// 进程 线程 多线程 计算机概念
    /// 进程：一个程序运行时，占用的全部计算资源的总和
    /// 线程：程序执行流的最小单位；任何操作都是由线程完成的；
    ///       线程是依托于进程存在的，一个进程可以包含多个线程；
    ///       线程也可以有自己的计算资源
    /// 多线程：多个执行流同时运行
    ///        1 CPU太快了，分时间片--上下文切换(加载环境--计算--保存环境)
    ///          微观角度，一个核同一时刻只能执行一个线程；宏观的来说是多线程并发
    ///        2 多CPU多核  可以独立工作
    ///          4核8线程--核是物理的核 线程是指虚拟核
    ///          
    ///   Thread是C#语言对线程对象的封装 
    ///   
    /// 是对方法执行的描述
    /// 同步：完成计算之后，再进入下一行
    /// 异步：不会等待方法的完成，会直接进入下一行  非阻塞
    /// 
    /// C# 异步和多线程有什么差别
    /// 多线程就是多个thread并发；
    /// 异步是硬件式的异步
    /// 异步多线程--thread pool task
    /// 
    /// 1 thread：线程等待，回调，前台线程/后台线程，  (扩展thread封装回调)
    /// 2 threadpool：线程池使用，设置线程池，ManualResetEvent
    /// 3 Task：waitall waitany  continueWhenAny continueWhenAll
    /// 4 并行运算Parallel
    /// </summary>
    class Program
    {
        /// <summary>
        /// 异步方法
        /// 1 同步方法卡界面，主(UI)线程忙于计算；
        ///   异步多线程方法不卡界面，主线程完事儿了，计算任务交给子线程在做；
        ///   winform提升用户体验；web一个业务操作后要发邮件，异步发送邮件
        /// 
        /// 2 同步方法慢，只有一个线程干活；
        ///   异步多线程方法快，因为多个线程并发运算；
        ///   并不是线性增长，a资源换时间，可能资源不够   b 多线程也有管理成本
        ///   但并不是越多越好
        ///   多个独立任务可以同时运行；
        ///   
        /// 3 异步多线程无序：启动无序  执行时间不确定  结束也无序
        ///   一定不要通过等几毫秒的形式来控制启动/执行时间/结束
        ///   
        /// 回调/状态等待/信号量
        static void Main(string[] args)
        {
            MyExampleDoem.Show3();
        }
    }
}
